#include<bits/stdc++.h> 
using namespace std;
//	甲级1043讲过二分查找树了，这题考察完全二分查找树，在BST的基础上增加了完全填充的条件。
//1.每个输入包括一个测试用例，每个测试用例第一行包括一个正整数N≤1000，然后N个正整数的值
//	所有数字不大于2000
//2.对于每个测试用例，输出一行层次遍历结果
//3.二叉树
//这题对比1043其实简单了不少，建树和层次遍历也不用多讲了，排序之后直接做很方便。这题
//最需要考虑的就是完全二叉树的左右各多少个结点的问题，这就意味着我们在把结点放入左右
//队列的时候必须先确定有多少个要放左边，多少个放右边，以及谁是根。
//这里的getPos函数就是用来解决这一问题的。因为完全二叉树永远是左边结点数大于等于右边
//所以我们就需要先确定好左边的个数，然后右边的就是剩下多少是多少 
struct Node{
	int key;
	Node* left = NULL;
	Node* right = NULL;
	queue<Node*> lq;
	queue<Node*> rq;
}; 
int getPos(int N){	//N是当前传进来的队列的长度 
	int a,b,c,n;	//a,b,c分别表示左、根、右的个数，n为当前剩余为安排的结点数 
	n = N - 1;	//先把根结点的1个拿掉 
	b = 1;	//根结点就1个 
	a = c = 0;	//左右各是0个开始 
	bool f = false;	//用来判断这一层的左边或者右边是否加完了，是的话下一次开始继续加另一边 
	while(n!=0){	//只要还有剩余未分配的结点 
		if(!f){	//从左开始，只要f是false就加左边 
			a++;	//左边个数+1 
			n--;	//剩余-1 
			if(a==2*c+1) f=true;	//比如上一次右边是k个结点，那么上一层的层数就是log_2(k+1)+1，那么这层的左边最多就是2k+1个结点 
		}
		else{	//当处理右边的时候 
			c++;	//右边+1 
			n--;	//总-1 
			if(c==a) f=false;	//当右边跟左边一样多了就换边 
		}
	}
	return a;
}
Node* build(Node* root){
	if(!root->lq.empty()){
		int N = root->lq.size();
		int a = getPos(N);
		Node* leftroot = new Node;
		for(int i = 0;i<N;i++){
			if(i<a) leftroot->lq.push(root->lq.front());
			else if(i==a) leftroot->key = root->lq.front()->key;
			else leftroot->rq.push(root->lq.front());
			root->lq.pop();
		}
		leftroot = build(leftroot);
		root->left = leftroot;
	}
	if(!root->rq.empty()){
		int N = root->rq.size();
		int a = getPos(N);
		Node* rightroot = new Node;
		for(int i = 0;i<N;i++){
			if(i<a) rightroot->lq.push(root->rq.front());
			else if(i==a) rightroot->key = root->rq.front()->key;
			else rightroot->rq.push(root->rq.front());
			root->rq.pop();
		}
		rightroot = build(rightroot);
		root->right = rightroot;
	}
	return root;
}
string ans;
void layerOut(Node* root){
	queue<Node*> Q;
	Q.push(root);
	while(!Q.empty()){
		if(Q.front()->left!=NULL) Q.push(Q.front()->left);
		if(Q.front()->right!=NULL) Q.push(Q.front()->right);
		stringstream ss;
		ss<<Q.front()->key;
		ans += ss.str() + " ";
		Q.pop();
	}
}
int main(){
	int N;
	cin>>N;
	if(N==0){
		cout<<endl;
		return 0;
	}
	int keys[N];
	for(int i = 0;i<N;i++){
		scanf("%d",&keys[i]);
	}
	sort(keys,keys+N);
	Node* root = new Node;
	int a = getPos(N);
	root->key = keys[a];
	for(int i = 0;i<a;i++){
		Node* tmp = new Node;
		tmp->key = keys[i];
		root->lq.push(tmp);
	}
	for(int i = a+1;i<N;i++){
		Node* tmp = new Node;
		tmp->key = keys[i];
		root->rq.push(tmp);
	}
	root = build(root);
	layerOut(root);
	cout<<ans.substr(0,ans.length()-1)<<endl;
	return 0;
}